/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ndj.daoimpl;


import br.com.ndj.conexao.FabricaConexao;
import br.com.ndj.dao.ColaboradorDAO;
import br.com.ndj.domain.Colaborador;
import br.com.ndj.exceptions.ColaboradorDAOException;
import br.com.ndj.exceptions.FabricaConexaoPoolVazioException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Osmar Vilarim
 * 18/09/2014
 */

public class ColaboradorDAOImpl implements ColaboradorDAO {
    
    private Connection conn = null;
    private String sql = "";
    private PreparedStatement pstmt = null;
    private List<Colaborador> listColaborador = new ArrayList<Colaborador>();
    
    
    public ColaboradorDAOImpl() {
        try {
            //conn = new FabricaConexao().abrirConexao();
            conn = FabricaConexao.getInstance().getConnectionFromPool();
        } catch (FabricaConexaoPoolVazioException ex) {
            //Logger.getLogger(LoginDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public boolean cadastrarColaborador(Colaborador colaborador) throws ColaboradorDAOException{
        boolean retorno = false;

        if (colaborador != null) {

            try {

                conn.setAutoCommit(false);
                sql = "INSERT INTO clb_colaborador (CLB_NOME,CLB_EMAIL) VALUES (?,?)";
                pstmt = conn.prepareStatement(sql);

                pstmt.setString(1, colaborador.getClbNome().trim());
                pstmt.setString(2, colaborador.getClbEmail().trim());
                
                int rows = pstmt.executeUpdate();

                if (rows > 0) {
                    System.out.println("Quantidade de linhas inseridas no banco: " + rows);
                }
                conn.commit();
                pstmt.close();

                retorno = true;
            } catch (SQLException e) {

                try {
                    conn.rollback();
                } catch (SQLException x) {
                    throw new ColaboradorDAOException(ColaboradorDAOException.ERRO_INSERIR_COLABORADOR, null);
                }

                throw new ColaboradorDAOException(ColaboradorDAOException.ERRO_INSERIR_COLABORADOR, null);
            } finally {
                FabricaConexao.getInstance().returnConnectionToPool(conn);
            }

        }

        return retorno;
    }

    @Override
    public boolean editarColaborador(Colaborador colaborador) throws ColaboradorDAOException {
         boolean retorno = false;

        if (colaborador != null) {

            try {
                conn.setAutoCommit(false);
                sql = "";
                sql = "UPDATE clb_colaborador SET CLB_NOME = ?, CLB_EMAIL = ? WHERE CLB_IDENTIFICADOR = ?";

                pstmt = conn.prepareStatement(sql);
                pstmt.setString(1, colaborador.getClbNome());
                pstmt.setString(2, colaborador.getClbEmail());
                pstmt.setInt(3, colaborador.getClbIdentificador());

                int rows = pstmt.executeUpdate();

                if (rows > 0) {
                    System.out.println("Quantidade de linhas inseridas no banco: " + rows);
                    retorno = true;
                }
                conn.commit();
                pstmt.close();

            } catch (SQLException ex) {
                
                try {
                    conn.rollback();
                } catch (SQLException e1) {
                    throw new ColaboradorDAOException(ColaboradorDAOException.ERRO_ALTERAR_COLABORADOR, null);
                }
                
                throw new ColaboradorDAOException(ColaboradorDAOException.ERRO_ALTERAR_COLABORADOR, null);

            } finally {
                FabricaConexao.getInstance().returnConnectionToPool(conn);
            }
        }
        return retorno;
    }

    @Override
    public boolean excluirColaborador(Colaborador colaborador) throws ColaboradorDAOException {
        boolean retorno = false;

        try {

            if (colaborador.getClbIdentificador()!= 0) {
                sql = "DELETE FROM clb_colaborador where CLB_IDENTIFICADOR = ?";
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, colaborador.getClbIdentificador());
            }

        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }

        try {

            conn.setAutoCommit(false);

            int rows = pstmt.executeUpdate();

            if (rows > 0) {
                System.out.println("Quantidade de linhas excluídas no banco: " + rows);
            }
            conn.commit();
            pstmt.close();

            retorno = true;
        } catch (SQLException e) {

            try {
                conn.rollback();
            } catch (SQLException e1) {
                throw new ColaboradorDAOException(ColaboradorDAOException.ERRO_EXCLUIR_COLABORADOR, null);
            }

            throw new ColaboradorDAOException(ColaboradorDAOException.ERRO_EXCLUIR_COLABORADOR, null);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return retorno;
    }

    @Override
    public List<Colaborador> listarColaborador() throws ColaboradorDAOException {
        listColaborador = new ArrayList<Colaborador>();
        
        try {
            sql = "SELECT CLB_IDENTIFICADOR,CLB_NOME,CLB_EMAIL FROM clb_colaborador";
            pstmt = conn.prepareStatement(sql);

            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                
                Colaborador colaborador = new Colaborador();
                
                colaborador.setClbIdentificador(rs.getInt("CLB_IDENTIFICADOR"));
                colaborador.setClbNome(rs.getString("CLB_NOME"));
                colaborador.setClbEmail(rs.getString("CLB_EMAIL"));
                
                this.listColaborador.add(colaborador);

            }//fim while

            pstmt.close();

        } catch (SQLException e) {
            throw new ColaboradorDAOException(ColaboradorDAOException.ERRO_LISTAR_COLABORADOR, null);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return this.listColaborador;
    }

    @Override
    public List<Colaborador> listarColaborador(Colaborador colaborador) throws ColaboradorDAOException {
        listColaborador = new ArrayList<Colaborador>();
        
        try {

            sql = "SELECT CLB_IDENTIFICADOR,CLB_NOME,CLB_EMAIL FROM clb_colaborador where CLB_NOME like ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "%"+colaborador.getClbNome()+"%");

            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                
                colaborador = new Colaborador();
                
                colaborador.setClbIdentificador(rs.getInt("CLB_IDENTIFICADOR"));
                colaborador.setClbNome(rs.getString("CLB_NOME"));
                colaborador.setClbEmail(rs.getString("CLB_EMAIL"));
                
                this.listColaborador.add(colaborador);

            }//fim while

            pstmt.close();

        } catch (SQLException e) {
            throw new ColaboradorDAOException(ColaboradorDAOException.ERRO_LISTAR_COLABORADOR, null);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return this.listColaborador;
    }
    
    
    
}
